/**
 * 表单验证规则
 * 使用示例：
 * import { required, email } from '@/utils/FormRule'
 *
 * <el-form-item prop="email" :rules="[required, email]">
 *    <el-input type="text" v-model="email" placeholder="邮箱" />
 * </el-form-item>
 */

// 字段必须，不能为空
export const required = {
  required: true,
  message: '该选项不可为空',
  trigger: 'change',
}

// 邮箱校验
export const email = {
  type: 'email',
  message: '请输入正确的邮箱',
  trigger: 'change',
}

// 手机号校验
export const phone = {
  pattern: /^1[3456789]\d{9}$/,
  message: '请输入正确的手机号',
  trigger: 'change',
}

// 英文字母, 大小写都可
export const letter = {
  pattern: /^[A-Za-z]+$/,
  message: '只能输入大写或小写英文字母',
  trigger: 'change',
}

// 小写字母或者下划线
export const lowercaseLetterOrUnderline = {
  pattern: /^[a-z_]+$/,
  message: '只能输入小写英文字母',
  trigger: 'change',
}

// 只允许输入数字
export const number = {
  message: '请输入正确的数值',
  trigger: 'blur',
  validator: limitNumber,
}

// 只允许输入JSON格式
export const json = {
  message: 'JSON格式不正确',
  trigger: 'change',
  validator: isJson,
}

// 自定义异步校验演示
export const age = {
  type: 'number',
  asyncValidator: ageValidator,
}

// 自定义校验规则演示
function limitNumber(rule, value, callback) {
  if (!value && !value?.trim()) {
    return callback(new Error(rule.msg))
  } else if (isNaN(value)) {
    callback(new Error('只允许输入数字'))
    //如果某个字段要求整数+数字
  } else if (rule.isInteger && !Number.isInteger(+value)) {
    callback(new Error('只允许输入整数'))
  } else {
    callback()
  }
}

// 自定义异步校验演示
function ageValidator(rule, value) {
  return new Promise((resolve, reject) => {
    if (value < 18) {
      reject('too young') // reject with error message
    } else {
      resolve()
    }
  })
}

// 验证输入的字符串是不是JSON
function isJson(rule, value) {
  return new Promise((resolve, reject) => {
    try {
      JSON.parse(value)
      resolve()
    } catch (e) {
      reject('JSON格式错误')
    }
  })
}

/**
 * 自定义校验函数，限制数字的最大值与最小值, max 与 min 需要通过 rule 传递
 * 用法：
 * <el-form-item prop="age"
 *    :rules="[{ max: 100, min: 0, message: '年龄范围只能在 0-100', validator: limitMaxMin }]">
 *    <el-input type="number" size="small" v-model="age" placeholder="年龄"></el-input>
 *  </el-form-item>
 */
export function limitMaxMin(rule, value, callback) {
  if (isNaN(value)) {
    callback(new Error('只允许输入数字'))
  } else if (value > rule.max) {
    callback(new Error(rule.message))
  } else if (value < rule.min) {
    callback(new Error(rule.message))
  }
  callback()
}
